/*
 * Created on 2005-10-8
 *
 */
package com.hd123.rumba.domain;

import java.util.List;

import net.sf.hibernate.HibernateException;

import com.hd123.rumba.cartridge.ICartFunctionView;
import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.exception.DuplicateIdException;
import com.hd123.rumba.exception.ParameterException;
import com.hd123.rumba.runtime.IManager;
import com.hd123.rumba.runtime.OperateContext;
import com.hd123.rumba.util.ClassifiedHashtable;
import com.hd123.rumba.util.LevelCode;

/**
 * @author caili
 */
public interface IDomainMgr extends IManager {

  /**
   * 创建域
   * 
   * @param parent
   *          可为空
   * @param code
   * @param name
   * @return
   * @throws ParameterException
   * @throws HibernateException
   * @throws DuplicateIdException
   */
  public IDomain createDomain(IDomain parent, String code, String name) throws HibernateException,
      BusinessException;

  /** @deprecated */
  public void saveDomain(IDomain domain) throws HibernateException, BusinessException;

  /**
   * 保存域。
   * 
   * @param domain
   *          要保存的域。
   * @param operate
   * @param oca
   * @throws BusinessException
   * @throws HibernateException
   */
  public void saveDomain(IDomain domain, OperateContext operate, long oca)
      throws BusinessException, HibernateException;

  /**
   * 保存指定的域，该域的uuid已经指定。
   * 
   * @param domain
   *          指定被保存的域。
   * @param operate
   * @throws BusinessException
   * @throws HibernateException
   */
  public void saveDomainWithUuid(IDomain domain, OperateContext operate) throws BusinessException,
      HibernateException;

  /**
   * 删除域. 检查是否存在子域.
   * 
   * @param domain
   * @throws HibernateException
   * @throws ParameterException
   * @throws BusinessException
   */
  public void removeDomain(IDomain domain) throws HibernateException, BusinessException;

  public IDomain getDomain(String uuid) throws HibernateException, BusinessException;

  /**
   * 根据uuid取得可用的域。
   * <p>
   * 所谓可用即状态不是删除的。
   * 
   * @param uuid
   *          域的uuid。
   * @return 返回找到的域，若找不到则返回null。
   * @throws BusinessException
   * @throws HibernateException
   */
  public IDomain getValidDomain(String uuid) throws BusinessException, HibernateException;

  /**
   * 根据代码，取得有效的域。所谓“有效”指的是状态不等于已删除的。
   * 
   * @param code
   *          指定域的代码。
   * @return 返回符合条件的域对象，若找不到则返回null。
   * @throws HibernateException
   * @throws BusinessException
   */
  public IDomain getDomainByCode(String code) throws HibernateException, BusinessException;

  public IDomain getDomainByLevelId(IDomain domain, String levelCode) throws HibernateException,
      BusinessException;

  /**
   * 取得指定的域的所有可用直接下级域的列表（不包含本身）。
   * 
   * @param domain
   *          指定的域
   * @return 域的列表
   * @throws HibernateException
   * @throws BusinessException
   */
  public List<IDomain> getDomainsByParent(IDomain domain) throws HibernateException,
      BusinessException;

  /**
   * 查找域domain中的domain, 根据parentLevelId生成新的levelId
   * 
   * @param domain
   * @param lc
   * @param parentLevelId
   *          null表示生成第0级的levelId
   * @return
   */
  public String createLevelId(IDomain domain, LevelCode lc, String parentLevelId)
      throws HibernateException, BusinessException;

  public List createRootDomainsList() throws HibernateException, BusinessException;

  public List createChildDomainsList(IDomain domain) throws HibernateException, BusinessException;

  /**
   * 取得下级组织.
   * 
   * @param domain
   * @param direct
   *          true表示紧下级组织, false表示所有下级组织.
   * @deprecated
   * @return List of IDomain
   */
  public List getLowerDomains(IDomain domain, boolean direct) throws HibernateException,
      BusinessException;

  /**
   * 取得根域对象。
   * 
   * @return 返回取得的根域对象，若找不到返回null。
   * @throws HibernateException
   * @throws BusinessException
   */
  public IDomain getRootDomain() throws HibernateException, BusinessException;

  /**
   * 清除根域的内存缓冲。当下次通过getRootDomain取得根域的时候，会自动从数据库中刷新内存缓冲。<br>
   * 
   * 设计用于安装程序调用。
   * 
   * @throws BusinessException
   */
  public void clearRootDomainCache() throws BusinessException;

  /**
   * 检查列表中的每个域, 补充从此域到root之间的upperDomain到列表中去. <br>
   * 返回的List就是输入的List, 并且按照domain.levelCode排序
   * 
   * @param domains
   *          List of IDomain
   * @return
   * @throws Exception
   */
  public List appendMiddleDomains(List domains) throws HibernateException, BusinessException,
      Exception;

  // ////////////////////////////////
  // About Cartridge and CartFuncView

  /**
   * 取得指定域已载入的构件包功能视图。
   * 
   * @param domain
   *          指定的域。
   * @return 返回构件包功能视图列表，若指定域没有装载任何构件包功能视图，则返回空的列表。
   * @throws BusinessException
   * @throws HibernateException
   */
  public List<ICartFunctionView> getCFVsByDomain(IDomain domain) throws BusinessException,
      HibernateException;

  /**
   * 判断指定域是否拥有指定的构件包功能视图。
   * 
   * @param domain
   *          指定的域
   * @param cfv
   *          指定的构件包功能视图。
   * @return true|false
   * @throws BusinessException
   * @throws HibernateException
   */
  public boolean hasCFV(IDomain domain, ICartFunctionView cfv) throws BusinessException,
      HibernateException;

  /**
   * 将指定构件包功能视图加入到域中。<br>
   * 修改域与构件包功能视图的关系。
   * 
   * @param cfv
   *          指定添加的构件包功能视图。
   * @param domain
   *          指定的域。
   * @param operate
   * @throws BusinessException
   * @throws HibernateException
   */
  public void assignCFVToDomain(ICartFunctionView cfv, IDomain domain, OperateContext operate)
      throws BusinessException, HibernateException;

  /**
   * 将指定的构件包功能视图从域中删除。<br>
   * 修改域与构件包功能视图的关系。
   * 
   * @param cfv
   *          指定被删除的构件包功能视图。
   * @param domain
   *          指定的域。
   * @param operate
   * @throws BusinessException
   * @throws HibernateException
   */
  public void removeCFVToDomain(ICartFunctionView cfv, IDomain domain, OperateContext operate)
      throws BusinessException, HibernateException;

  /**
   * 保存域功能视图到数据库。<br>
   * 设计提供给系统维护使用。
   * 
   * @param dfv
   *          被保存的域功能视图对象。
   * @param operate
   * @throws BusinessException
   * @throws HibernateException
   */
  public void saveDomainFuncView(IDomainFuncView dfv, OperateContext operate)
      throws BusinessException, HibernateException;

  /** @deprecated */
  public IDomain getSupplierByCode(IDomain domain, String code) throws HibernateException,
      BusinessException;

  /** @deprecated */
  public ClassifiedHashtable verifyOrganization(IDomain org) throws BusinessException;

  /**
   * 查找域domain中的domain, 取得最新的门店配货次序。最新门店配货次序＝最大门店配货次序 + 10
   * 
   * @deprecated
   * @param domain
   * @return
   */
  public Integer createNewDeliveryOrder(IDomain domain) throws Exception;

  /**
   * 找到指定域下的所有门店
   * 
   * @deprecated
   * @param upperDomain
   * @return l
   * @throws Exception
   */
  public List getStoreByUpperDomain(IDomain upperDomain) throws Exception;

}
